<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<link rel="stylesheet" type="text/css" href="../css/common.css" media="all" />
<link rel="stylesheet" type="text/css" href="../css/article.css" media="all" />
</head>
<body>
<div id="w3h_body">
  <div class="body_content">
    <!-- toc begin -->
    <h1 class="title">RT1010: 仅 Firefox 支持小数数值的 'letter-spacing' 特性</h1>
    <ul class="toc">
      <li><a href="#standard_reference">标准参考</a> <span>•</span></li>
      <li><a href="#description">问题描述</a> <span>•</span></li>
      <li><a href="#influence">造成的影响</a> <span>•</span></li>
      <li><a href="#impacted_browsers">受影响的浏览器</a> <span>•</span></li>
      <li><a href="#analysis_of_issues">问题分析</a> <span>•</span></li>
      <li><a href="#solutions">解决方案</a> <span>•</span></li>
      <li><a href="#see_also">参见</a></li>
    </ul>
    <!-- toc end -->
    <div id="w3h_content">
      <!-- content begin -->
      <address class="author">作者：陆远</address>
    <h2 id="standard_reference">标准参考</h2>
    <p>根据 W3C CSS 2.1 规范中的描述，'letter-spacing' 特性指定了文本字符间的间距特性。其取值的含义如下：</p>
    <ul>
      <li>normal：指定间距是当前字体的常规间距。这个值允许用户端适当的改变字符间距以对齐文本；</li>
      <li>&lt;length&gt;：这个值指出在除缺省的字符间距外额外的字符间距。数值可以为负数，但是可能有与实现相关的限制。用户端不能因对齐文本而进一步增加或减少字符间距。</li>
    </ul>
    <p>关于 'letter-spacing' 特性的详细信息，请参照 CSS 2.1 规范 <a href="http://www.w3.org/TR/CSS21/text.html#spacing-props">16.4 Letter and word spacing: the 'letter-spacing' and 'word-spacing' properties</a> 中的内容。</p>

    <h2 id="description">问题描述</h2>
    <p>Firefox 中支持 'letter-spacing' 特性以 px 为单位时的小数数值。</p>

    <h2 id="influence">造成的影响</h2>
    <p>各浏览器对 'letter-spacing' 特性以 px 为单位时的小数数值支持不同会造成应用了该特性的文本的宽度产生差异，进而可能影响到布局。</p>

    <h2 id="impacted_browsers">受影响的浏览器</h2>
    <table class="list">
      <tr>
        <th>Firefox</th>
        <td>&nbsp;</td>
      </tr>
    </table>

    <h2 id="analysis_of_issues">问题分析</h2>
    <p>通过规范原文可知，字符间距的算法与用户端相关。W3C 并未明确规定具体算法。</p>
    <p>分析以下代码：</p>
    <pre>&lt;html&gt;
&lt;head&gt;
&lt;style&gt;
  * { font:12px Arial; }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;table&gt;
&lt;script&gt;
  for (var i = -5; i &lt;= 10; i++) {
    document.write('&lt;tr&gt;&lt;td id="a' + (i / 2) + '"&gt;&lt;/td&gt;&lt;td&gt;&lt;span id="s' + (i / 2) + '" style="background:#DDD;letter-spacing:' + (i / 2) + 'px"&gt;letter-spacing&lt;/span&gt;&lt;/td&gt;&lt;td id="c' + (i / 2) + '"&gt;&lt;/td&gt;&lt;/tr&gt;');
  }

  window.onload = function() {
    function $(id) { return document.getElementById(id); }
    if (!window.getComputedStyle) {
      window.getComputedStyle = function($target){
        return $target.currentStyle;
      };
    }
    for (var i = -5; i &lt;= 10; i++) {
      document.getElementById("a" + (i / 2)).innerHTML = (i / 2);
      document.getElementById("c" + (i / 2)).innerHTML = getComputedStyle(document.getElementById("s" + (i / 2))).letterSpacing;
    }
  }
&lt;/script&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>

    <p>上面代码创建了一系列的设置了 'letter-spacing' 特性的 SPAN 元素，其中 'letter-spacing' 的取值从 -3px 至 5px 不等，包括小数数值（如 1.5px）。并获得这些 SPAN 元素计算后的 'letter-spacing' 的值。</p>
    <p>这段代码在不同浏览器中运行结果如下：</p>
    <table class="compare">
      <tr>
        <th>IE6 IE7 IE8(Q) Opera</th>
        <th>IE8(S)</th>
        <th>Firefox</th>
        <th>Chrome Safari</th>
      </tr>
      <tr>
        <td><img src="../../tests/RT1010/01.gif" alt="IE6 IE7 IE8(Q) Opera" /></td>
        <td><img src="../../tests/RT1010/02.gif" alt="IE8(S)" /></td>
        <td><img src="../../tests/RT1010/03.gif" alt="Firefox" /></td>
        <td><img src="../../tests/RT1010/04.gif" alt="Chrome Safari" /></td>
      </tr>
    </table>
    <p>可见，对于以 px 为单位的 'letter-spacing' 特性的值：</p>
    <ul>
      <li>在 <em>IE6 IE7 IE8(Q) Chrome Safari Opera</em> 中，只支持整数，若值为小数，则会将其小数点后的部分直接舍弃，如 1.5px 变为 1px、-5px 变为 -2px；</li>
      <li>在 <em>IE8(S)</em> 中，同样只支持整数，若为小数，则会将其进出去正负号的纯数字部分做四舍五入处理，如 1.49px 变为 1px、-2.51px 变为 -3px；</li>
      <li>在 <em>Firefox</em> 中，支持小数数值，且成线性规律。</li>
    </ul>
    <p>值得注意的是，px 是相对于浏览设备的像素点，通常应该为整数值。 Firefox 对小数数值的 px 的支持可以看做是对 'letter-spacing' 特性的扩展。</p>

    <h2 id="solutions">解决方案</h2>
    <p>避免在使用 px 单位时为 'letter-spacing' 特性设置小数数值。</p>

      <h2 id="see_also">参见</h2>
      <h3>知识库</h3>
      <ul class="see_also">
        <li><a href="#">...</a></li>
      </ul>

      <h3>相关问题</h3>
      <ul class="see_also">
        <li><a href="#">...</a></li>
      </ul>

      <div class="appendix">
        <h2>测试环境</h2>
        <table class="list">
          <tr>
            <th>操作系统版本:</th>
            <td>Windows 7 Ultimate build 7600</td>
          </tr>
          <tr>
            <th>浏览器版本:</th>
            <td>
              IE6<br />
              IE7<br />
              IE8<br />
              Firefox 3.6.8<br />
              Chrome 6.0.472.11 dev<br />
              Safari 5.0.1<br />
              Opera 10.60
            </td>
          </tr>
          <tr>
            <th>测试页面:</th>
            <td><a href="../../tests/RT1010/firefox_letter_spacing.html">firefox_letter_spacing.html</a></td>
          </tr>
          <tr>
            <th>本文更新时间:</th>
            <td>2010-08-11</td>
          </tr>
        </table>

        <h2>关键字</h2>  
        <!-- keywords begin -->
        <p>Firefox letter-spacing 文字 间距 小数 decimal</p>
        <!-- keywords end -->
      </div>
      <!-- content end -->
    </div>
  </div>
</div>
</body>
</html>
